header{
package PL.practica3;
/* código de cabecera */
}
options{

/* opciones comunes a toda la especificación */
}

///////////////////////////////
// Analizador léxico
///////////////////////////////
class Analex extends Lexer;
options{
/* opciones comunes a toda la especificación */
	//caseSensitive = false;
}
tokens{
	IF = "IF";
	TRUE = "TRUE";
	FALSE =  "FALSE";
	SET = "SET";
	FOR = "FOR";
	WHILE = "WHILE";
}
BLANCO: (' '|'\t'|"\r\n") {$setType(Token.SKIP);};
protected SLASH: '/';
protected LETRA : ('a'..'z')|('A'..'Z')|'_';
protected DIGITO : '0'..'9';
NUMERO : (DIGITO)+('.'(DIGITO)+)?;
protected COMILLA: '"';
protected DOLLAR : '$';
IDENT : LETRA(LETRA|DIGITO)*;
IDENTSET: (DOLLAR)LETRA(LETRA|DIGITO)*;
SEPARADOR: ';';
IGUAL : '=';
//BOOL : ("TRUE"|"FALSE");
OPERADOR : '<'|'>';
PARENTESIS1 : '(';
PARENTESIS2 : ')';
LLAVE1 : '{';
LLAVE2 : '}';
MAS : '+';
MENOS : '-';
PATH : (SLASH(IDENT))+;
CADENA : COMILLA (LETRA|BLANCO|DIGITO)+ COMILLA;


///////////////////////////////
// Analizador sintáctico
///////////////////////////////
class Anasint extends Parser;
options{
/* opciones comunes a toda la especificación */
}

asignacion : IDENT IGUAL (TRUE|FALSE|NUMERO|PATH|CADENA) SEPARADOR;
bloqueIf: IF PARENTESIS1 (IDENT|IDENTSET) PARENTESIS2 LLAVE1 (asignacion|asignacionSet)+ LLAVE2;
asignacionSet : SET IDENTSET IGUAL (TRUE|FALSE|NUMERO|CADENA|PATH) SEPARADOR;
bloqueFor : FOR PARENTESIS1 asignacion SEPARADOR OPERACION SEPARADOR IDENT ((MAS MAS)|(MENOS MENOS)) PARENTESIS2 LLAVE1 entrada LLAVE2;
bloqueWhile : WHILE PARENTESIS1  IDENT (OPERADOR|IGUAL) (IDENT|NUMERO) PARENTESIS2 LLAVE1 entrada LLAVE2;
entrada :  (asignacion | asignacionSet | bloqueIf| bloqueFor| bloqueWhile)* EOF;




